--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Commit 9b5bb4b42419e3e6880735caabc546056e1194ba
Parents : 335f466
Author : Sudo-Ivan <ivan@quad4.io>
Signature : Signature validation error
Date : 2026-03-05T21:34:25-06:00
Update version to 4.2.0
Changes
10 files changed, 59 insertions(+), 60 deletions(-)
Diff
diff --git a/flake.nix b/flake.nix
index 1cdb4fa2..f9e445fb 100644
--- a/flake.nix
+++ b/flake.nix
@@ -74,7 +74,7 @@
# Simple package definition for the backend
packages.default = pkgs.python312Packages.buildPythonPackage {
pname = "reticulum-meshchatx";
- version = "4.1.0";
+ version = "4.2.0";
src = ./.;
format = "pyproject";
diff --git a/meshchatx/__init__.py b/meshchatx/__init__.py
index 5112b658..9afac4d9 100644
--- a/meshchatx/__init__.py
+++ b/meshchatx/__init__.py
@@ -1,3 +1,3 @@
"""Reticulum MeshChatX - A mesh network communications app."""
-__version__ = "4.1.0"
+__version__ = "4.2.0"
diff --git a/meshchatx/meshchat.py b/meshchatx/meshchat.py
index f1669722..cbbbcdec 100644
--- a/meshchatx/meshchat.py
+++ b/meshchatx/meshchat.py
@@ -7604,11 +7604,10 @@ class ReticulumMeshChat:
count = request.query.get("count")
after_id = request.query.get("after_id")
- # get source hash from local lxmf destination
local_hash = self.local_lxmf_destination.hash.hex()
- # fetch messages from database
- results = self.message_handler.get_conversation_messages(
+ results = await asyncio.to_thread(
+ self.message_handler.get_conversation_messages,
local_hash,
destination_hash,
limit=int(count) if count else 100,
@@ -7770,8 +7769,8 @@ class ReticulumMeshChat:
local_hash = self.local_lxmf_destination.hexhash
- # fetch conversations from database with optimized query
- db_conversations = self.message_handler.get_conversations(
+ db_conversations = await asyncio.to_thread(
+ self.message_handler.get_conversations,
local_hash,
search=search_query,
filter_unread=filter_unread,
diff --git a/meshchatx/src/version.py b/meshchatx/src/version.py
index fc3ecfdc..0bb84504 100644
--- a/meshchatx/src/version.py
+++ b/meshchatx/src/version.py
@@ -2,4 +2,4 @@
share the same version string.
"""
-__version__ = "4.1.0"
+__version__ = "4.2.0"
diff --git a/packaging/arch/PKGBUILD b/packaging/arch/PKGBUILD
index eb40fd94..e7545e75 100644
--- a/packaging/arch/PKGBUILD
+++ b/packaging/arch/PKGBUILD
@@ -1,7 +1,7 @@
# Maintainer: Ivan <ivan@quad4.io>
pkgname=reticulum-meshchatx-git
_pkgname=reticulum-meshchatx
-pkgver=4.1.0.r7.g9cfbf94
+pkgver=4.2.0
pkgrel=1
pkgdesc="A simple mesh network communications app powered by the Reticulum Network Stack"
arch=('x86_64' 'aarch64')
@@ -19,7 +19,7 @@ sha256sums=('SKIP'
pkgver() {
cd "$_pkgname"
git describe --long --tags 2>/dev/null | sed 's/^v//;s/\([^-]*-g\)/r\1/;s/-/./g' || \
- printf "4.1.0.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
+ printf "4.2.0.r%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)"
}
prepare() {
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9924c5f6..edae3b54 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -27,7 +27,7 @@ importers:
version: 0.5.11(tailwindcss@3.4.19)
'@vitejs/plugin-vue':
specifier: ^5.2.4
- version: 5.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))
+ version: 5.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))
axios:
specifier: ^1.13.6
version: 1.13.6
@@ -69,10 +69,10 @@ importers:
version: 9.1.13(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)(keycharm@0.4.0)(uuid@11.1.0)(vis-data@7.1.10(uuid@11.1.0)(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0)))(vis-util@5.0.7(@egjs/hammerjs@2.0.17)(component-emitter@2.0.0))
vite:
specifier: ^6.4.1
- version: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
+ version: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
vite-plugin-vuetify:
specifier: ^2.1.3
- version: 2.1.3(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2)
+ version: 2.1.3(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2)
vue:
specifier: ^3.5.29
version: 3.5.29(typescript@5.9.3)
@@ -181,7 +181,7 @@ importers:
version: 5.46.0
vitest:
specifier: ^3.2.4
- version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.3)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0)
+ version: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0)
packages:
@@ -1011,11 +1011,11 @@ packages:
'@types/mute-stream@0.0.4':
resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==}
- '@types/node@22.19.13':
- resolution: {integrity: sha512-akNQMv0wW5uyRpD2v2IEyRSZiR+BeGuoB6L310EgGObO44HSMNT8z1xzio28V8qOrgYaopIDNA18YgdXd+qTiw==}
+ '@types/node@22.19.15':
+ resolution: {integrity: sha512-F0R/h2+dsy5wJAUe3tAU6oqa2qbWY5TpNfL/RGmo1y38hiyO1w3x2jPtt76wmuaJI4DQnOBu21cNXQ2STIUUWg==}
- '@types/node@25.3.3':
- resolution: {integrity: sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==}
+ '@types/node@25.3.5':
+ resolution: {integrity: sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==}
'@types/plist@3.0.5':
resolution: {integrity: sha512-E6OCaRmAe4WDmWNsL/9RMqdkkzDCY1etutkflWk4c+AcjDU07Pcz1fQwTX0TQz+Pxqn9i4L1TU3UFpjnrcDgxA==}
@@ -4647,7 +4647,7 @@ snapshots:
'@inquirer/figures': 1.0.15
'@inquirer/type': 2.0.0
'@types/mute-stream': 0.0.4
- '@types/node': 22.19.13
+ '@types/node': 22.19.15
'@types/wrap-ansi': 3.0.0
ansi-escapes: 4.3.2
cli-width: 4.1.0
@@ -4981,7 +4981,7 @@ snapshots:
dependencies:
'@types/http-cache-semantics': 4.2.0
'@types/keyv': 3.1.4
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
'@types/responselike': 1.0.3
'@types/chai@5.2.3':
@@ -5009,7 +5009,7 @@ snapshots:
'@types/fs-extra@9.0.13':
dependencies:
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
'@types/hammerjs@2.0.46': {}
@@ -5019,25 +5019,25 @@ snapshots:
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
'@types/ms@2.1.0': {}
'@types/mute-stream@0.0.4':
dependencies:
- '@types/node': 22.19.13
+ '@types/node': 22.19.15
- '@types/node@22.19.13':
+ '@types/node@22.19.15':
dependencies:
undici-types: 6.21.0
- '@types/node@25.3.3':
+ '@types/node@25.3.5':
dependencies:
undici-types: 7.18.2
'@types/plist@3.0.5':
dependencies:
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
xmlbuilder: 15.1.1
optional: true
@@ -5045,7 +5045,7 @@ snapshots:
'@types/responselike@1.0.3':
dependencies:
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
'@types/trusted-types@2.0.7':
optional: true
@@ -5057,12 +5057,12 @@ snapshots:
'@types/yauzl@2.10.3':
dependencies:
- '@types/node': 22.19.13
+ '@types/node': 22.19.15
optional: true
- '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))':
+ '@vitejs/plugin-vue@5.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))':
dependencies:
- vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
+ vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
vue: 3.5.29(typescript@5.9.3)
'@vitest/expect@3.2.4':
@@ -5073,13 +5073,13 @@ snapshots:
chai: 5.3.3
tinyrainbow: 2.0.0
- '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))':
+ '@vitest/mocker@3.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))':
dependencies:
'@vitest/spy': 3.2.4
estree-walker: 3.0.3
magic-string: 0.30.21
optionalDependencies:
- vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
+ vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
'@vitest/pretty-format@3.2.4':
dependencies:
@@ -5114,7 +5114,7 @@ snapshots:
sirv: 3.0.2
tinyglobby: 0.2.15
tinyrainbow: 3.0.3
- vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.3)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0)
+ vitest: 3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0)
'@vitest/utils@3.2.4':
dependencies:
@@ -5996,7 +5996,7 @@ snapshots:
electron@39.8.0:
dependencies:
'@electron/get': 2.0.3
- '@types/node': 22.19.13
+ '@types/node': 22.19.15
extract-zip: 2.0.1
transitivePeerDependencies:
- supports-color
@@ -6688,7 +6688,7 @@ snapshots:
jest-worker@27.5.1:
dependencies:
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
merge-stream: 2.0.0
supports-color: 8.1.1
@@ -7357,7 +7357,7 @@ snapshots:
'@protobufjs/path': 1.1.2
'@protobufjs/pool': 1.1.0
'@protobufjs/utf8': 1.1.0
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
long: 5.3.2
protocol-buffers-schema@3.6.0: {}
@@ -7978,13 +7978,13 @@ snapshots:
'@egjs/hammerjs': 2.0.17
component-emitter: 2.0.0
- vite-node@3.2.4(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0):
+ vite-node@3.2.4(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0):
dependencies:
cac: 6.7.14
debug: 4.4.3
es-module-lexer: 1.7.0
pathe: 2.0.3
- vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
+ vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
transitivePeerDependencies:
- '@types/node'
- jiti
@@ -7999,18 +7999,18 @@ snapshots:
- tsx
- yaml
- vite-plugin-vuetify@2.1.3(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2):
+ vite-plugin-vuetify@2.1.3(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2):
dependencies:
'@vuetify/loader-shared': 2.1.2(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2)
debug: 4.4.3
upath: 2.0.1
- vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
+ vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
vue: 3.5.29(typescript@5.9.3)
vuetify: 3.12.2(typescript@5.9.3)(vite-plugin-vuetify@2.1.3)(vue@3.5.29(typescript@5.9.3))
transitivePeerDependencies:
- supports-color
- vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0):
+ vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0):
dependencies:
esbuild: 0.25.12
fdir: 6.5.0(picomatch@4.0.3)
@@ -8019,16 +8019,16 @@ snapshots:
rollup: 4.59.0
tinyglobby: 0.2.15
optionalDependencies:
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
fsevents: 2.3.3
jiti: 1.21.7
terser: 5.46.0
- vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.3.3)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0):
+ vitest@3.2.4(@types/debug@4.1.12)(@types/node@25.3.5)(@vitest/ui@4.0.18)(jiti@1.21.7)(jsdom@26.1.0)(terser@5.46.0):
dependencies:
'@types/chai': 5.2.3
'@vitest/expect': 3.2.4
- '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))
+ '@vitest/mocker': 3.2.4(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))
'@vitest/pretty-format': 3.2.4
'@vitest/runner': 3.2.4
'@vitest/snapshot': 3.2.4
@@ -8046,12 +8046,12 @@ snapshots:
tinyglobby: 0.2.15
tinypool: 1.1.1
tinyrainbow: 2.0.0
- vite: 6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
- vite-node: 3.2.4(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0)
+ vite: 6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
+ vite-node: 3.2.4(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/debug': 4.1.12
- '@types/node': 25.3.3
+ '@types/node': 25.3.5
'@vitest/ui': 4.0.18(vitest@3.2.4)
jsdom: 26.1.0
transitivePeerDependencies:
@@ -8109,7 +8109,7 @@ snapshots:
vue: 3.5.29(typescript@5.9.3)
optionalDependencies:
typescript: 5.9.3
- vite-plugin-vuetify: 2.1.3(vite@6.4.1(@types/node@25.3.3)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2)
+ vite-plugin-vuetify: 2.1.3(vite@6.4.1(@types/node@25.3.5)(jiti@1.21.7)(terser@5.46.0))(vue@3.5.29(typescript@5.9.3))(vuetify@3.12.2)
w3c-xmlserializer@5.0.0:
dependencies:
diff --git a/pyproject.toml b/pyproject.toml
index 7d5e0929..f7ea52d8 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "reticulum-meshchatx"
-version = "4.1.0"
+version = "4.2.0"
description = "A simple mesh network communications app powered by the Reticulum Network Stack"
authors = [
{name = "Sudo-Ivan"}
diff --git a/tests/backend/test_app_status_tracking.py b/tests/backend/test_app_status_tracking.py
index 3bcb2312..71e56bc9 100644
--- a/tests/backend/test_app_status_tracking.py
+++ b/tests/backend/test_app_status_tracking.py
@@ -94,8 +94,8 @@ async def test_app_status_endpoints(mock_rns_minimal, temp_dir):
app_instance.config.set("tutorial_seen", True)
assert app_instance.config.get("tutorial_seen") == "true"
- app_instance.config.set("changelog_seen_version", "4.1.0")
- assert app_instance.config.get("changelog_seen_version") == "4.1.0"
+ app_instance.config.set("changelog_seen_version", "4.2.0")
+ assert app_instance.config.get("changelog_seen_version") == "4.2.0"
# Test app_info returns these values
with ExitStack() as info_stack:
@@ -111,4 +111,4 @@ async def test_app_status_endpoints(mock_rns_minimal, temp_dir):
assert val == "true"
val = app_instance.config.get("changelog_seen_version")
- assert val == "4.1.0"
+ assert val == "4.2.0"
diff --git a/tests/frontend/AppModals.test.js b/tests/frontend/AppModals.test.js
index b0dce1de..9a55e56d 100644
--- a/tests/frontend/AppModals.test.js
+++ b/tests/frontend/AppModals.test.js
@@ -62,9 +62,9 @@ describe("App.vue Modals", () => {
return Promise.resolve({
data: {
app_info: {
- version: "4.1.0",
+ version: "4.2.0",
tutorial_seen: true,
- changelog_seen_version: "4.1.0",
+ changelog_seen_version: "4.2.0",
},
},
});
@@ -94,7 +94,7 @@ describe("App.vue Modals", () => {
return Promise.resolve({
data: {
app_info: {
- version: "4.1.0",
+ version: "4.2.0",
tutorial_seen: false,
changelog_seen_version: "0.0.0",
},
@@ -153,7 +153,7 @@ describe("App.vue Modals", () => {
return Promise.resolve({
data: {
app_info: {
- version: "4.1.0",
+ version: "4.2.0",
tutorial_seen: true,
changelog_seen_version: "3.9.0",
},
@@ -161,7 +161,7 @@ describe("App.vue Modals", () => {
});
}
if (url === "/api/v1/app/changelog") {
- return Promise.resolve({ data: { html: "<h1>New Features</h1>", version: "4.1.0" } });
+ return Promise.resolve({ data: { html: "<h1>New Features</h1>", version: "4.2.0" } });
}
if (url === "/api/v1/config") return Promise.resolve({ data: { config: { theme: "dark" } } });
if (url === "/api/v1/auth/status") return Promise.resolve({ data: { auth_enabled: false } });
diff --git a/tests/frontend/ChangelogModal.test.js b/tests/frontend/ChangelogModal.test.js
index 9cab1313..cc0f346a 100644
--- a/tests/frontend/ChangelogModal.test.js
+++ b/tests/frontend/ChangelogModal.test.js
@@ -78,7 +78,7 @@ describe("ChangelogModal.vue", () => {
axiosMock.get.mockResolvedValue({
data: {
html: "<h1>Test</h1>",
- version: "4.1.0",
+ version: "4.2.0",
},
});
@@ -95,7 +95,7 @@ describe("ChangelogModal.vue", () => {
axiosMock.get.mockResolvedValue({
data: {
html: "<h1>Test</h1>",
- version: "4.1.0",
+ version: "4.2.0",
},
});
@@ -114,7 +114,7 @@ describe("ChangelogModal.vue", () => {
axiosMock.get.mockResolvedValue({
data: {
html: "<h1>Test</h1>",
- version: "4.1.0",
+ version: "4.2.0",
},
});
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────